package com.klm.easymq.core;

import java.util.List;
import java.util.Map;

/**
 * 监控服务接口
 * 支持SQLite和内存两种存储方式
 * 增强版：支持MQ故障排查和生命周期监控
 */
public interface MonitorService {
    
    /**
     * 记录消息发送
     * @param traceId 追踪ID
     * @param topic 主题
     * @param message 消息内容
     * @param status 状态
     */
    void recordMessageSend(String traceId, String topic, String message, String status);
    
    /**
     * 记录消息消费
     * @param traceId 追踪ID
     * @param topic 主题
     * @param status 状态
     * @param errorMsg 错误信息（如果有）
     */
    void recordMessageConsume(String traceId, String topic, String status, String errorMsg);
    
    /**
     * 记录消费者生命周期事件
     * @param consumerId 消费者ID
     * @param group 消费者组
     * @param topic 主题
     * @param eventType 事件类型（START/STOP/ERROR/RECONNECT）
     * @param details 详细信息
     */
    void recordConsumerLifecycle(String consumerId, String group, String topic, String eventType, String details);
    
    /**
     * 记录MQ服务连接状态变化
     * @param adapterType 适配器类型
     * @param status 连接状态（CONNECTED/DISCONNECTED/ERROR）
     * @param errorMsg 错误信息（如果有）
     */
    void recordConnectionStatus(String adapterType, String status, String errorMsg);
    
    /**
     * 记录消息重试事件
     * @param traceId 追踪ID
     * @param topic 主题
     * @param attempt 重试次数
     * @param errorMsg 错误信息
     */
    void recordRetryEvent(String traceId, String topic, int attempt, String errorMsg);
    
    /**
     * 记录幂等跳过事件
     * @param traceId 追踪ID
     * @param topic 主题
     * @param reason 跳过原因
     */
    void recordIdempotentSkip(String traceId, String topic, String reason);
    
    /**
     * 查询消息记录
     * @param traceId 追踪ID
     * @return 消息记录列表
     */
    List<Map<String, Object>> queryByTraceId(String traceId);
    
    /**
     * 查询失败的消息记录
     * @param topic 主题（可选）
     * @param startTime 开始时间
     * @param endTime 结束时间
     * @param limit 限制数量
     * @return 失败消息记录列表
     */
    List<Map<String, Object>> queryFailedMessages(String topic, String startTime, String endTime, int limit);
    
    /**
     * 查询消费者生命周期事件
     * @param consumerId 消费者ID（可选）
     * @param group 消费者组（可选）
     * @param startTime 开始时间
     * @param endTime 结束时间
     * @return 生命周期事件列表
     */
    List<Map<String, Object>> queryConsumerLifecycle(String consumerId, String group, String startTime, String endTime);
    
    /**
     * 查询连接状态变化历史
     * @param adapterType 适配器类型（可选）
     * @param startTime 开始时间
     * @param endTime 结束时间
     * @return 连接状态变化记录
     */
    List<Map<String, Object>> queryConnectionHistory(String adapterType, String startTime, String endTime);
    
    /**
     * 获取主题统计信息
     * @param topic 主题
     * @return 统计信息
     */
    Map<String, Object> getTopicStats(String topic);
    
    /**
     * 获取故障统计信息
     * @param startTime 开始时间
     * @param endTime 结束时间
     * @return 故障统计信息
     */
    Map<String, Object> getFailureStats(String startTime, String endTime);
    
    /**
     * 清理过期数据
     * @param retentionDays 保留天数
     */
    void cleanupExpiredData(int retentionDays);
    
    /**
     * 获取监控服务类型
     * @return 监控服务类型
     */
    String getType();
} 